package jkgl.information;

import cn.hutool.core.util.StrUtil;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Map;

@Component
@RequiredArgsConstructor
public class EmailUtil {
    // 邮箱配置类
    @Resource
    private  EmailConfig eMailProperties;
    // 邮箱发送类
    @Resource
    private  JavaMailSender javaMailSender;
    // 页面模板渲染配置类
    @Resource
    private  FreeMarkerConfigurer freeMarkerConfigurer;

    /**
     * 发送文本邮件
     *
     * @param title       标题
     * @param text        文本
     * @param targetMails 目标邮箱
     */
    public void sendText(String title, String text, String... targetMails) {
        sendText(title, text, null, targetMails);
    }

    /**
     * 发送文本邮件
     *
     * @param title       标题
     * @param text        文本
     * @param Cc          抄送人
     * @param targetMails 目标邮箱
     */
    @SneakyThrows(Exception.class)
    public void sendText(String title, String text, String Cc, String... targetMails) {
        SimpleMailMessage message = new SimpleMailMessage();
        // 发件人邮箱地址
        message.setFrom(eMailProperties.getUsername());
        // 收件人邮箱地址数组(可实现批量发送)
        message.setTo(targetMails);
        // 邮箱标题
        message.setSubject(title);
        // 邮箱内容
        message.setText(text);
        if (StrUtil.isNotEmpty(Cc)) {
            // 抄送人邮箱地址
            message.setCc(Cc);
        }
        // 发送邮件
        javaMailSender.send(message);
    }

    /**
     * 发送HTML超文本邮件
     *
     * @param title       标题
     * @param templateName        模板名称(带后缀)
     * @param model        使用Map作为数据模型，定义属性和值
     * @param targetMails 目标邮箱
     */
    public void sendHtmlTemplate(String title, String templateName, Map<String, Object> model, String... targetMails) throws Exception {
        String html = templateHtml(templateName, model);
        sendHtmlText(title, html, null, targetMails);
    }

    /**
     * 发送HTML超文本邮件
     *
     * @param title       标题
     * @param html        HTML超文本
     * @param targetMails 目标邮箱
     */
    public void sendHtmlText(String title, String html, String... targetMails) throws Exception {
        sendHtmlText(title, html, null, targetMails);
    }

    /**
     * 发送HTML超文本邮件
     *
     * @param title       标题
     * @param html        HTML超文本
     * @param Cc          抄送人
     * @param targetMails 目标邮箱
     */
    @SneakyThrows(MessagingException.class)
    public void sendHtmlText(String title, String html, String Cc, String... targetMails) throws Exception {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeHelper = new MimeMessageHelper(message, true);
        // 发件人邮箱地址
        mimeHelper.setFrom(eMailProperties.getUsername());
        // 收件人邮箱地址数组(可实现批量发送)
        mimeHelper.setTo(targetMails);
        // 邮箱标题
        mimeHelper.setSubject(title);
        // 邮箱内容, true代表是html内容
        mimeHelper.setText(html, true);
        if (StrUtil.isNotEmpty(Cc)) {
            // 抄送人邮箱地址
            mimeHelper.setCc(Cc);
        }
        // 发送邮件
        javaMailSender.send(message);
    }

    /**
     * 发送携带附件文件的邮件
     *
     * @param title       标题
     * @param text        文本
     * @param fileMap     附件集合
     * @param targetMails 目标邮箱
     */
    public void sendAttachFileMail(String title, String text, Map<String, String> fileMap, String... targetMails) {
        sendAttachFileMail(title, text, null, fileMap, targetMails);
    }

    /**
     * 发送携带附件文件的邮件
     *
     * @param title       标题
     * @param text        文本
     * @param Cc          抄送人
     * @param fileMap     附件集合
     * @param targetMails 目标邮箱
     */
    @SneakyThrows(MessagingException.class)
    public void sendAttachFileMail(String title, String text, String Cc, Map<String, String> fileMap, String... targetMails) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        // 构建一个带附件的邮件对象
        try {
            MimeMessageHelper mimeHelper = new MimeMessageHelper(mimeMessage, true);

        // 发件人邮箱地址
        mimeHelper.setFrom(eMailProperties.getUsername());
        // 收件人邮箱地址数组(可实现批量发送)
        mimeHelper.setTo(targetMails);
        // 邮箱标题
        mimeHelper.setSubject(title);
        // 邮箱内容
        mimeHelper.setText(text);
        for (String filename : fileMap.keySet()) {
            //第一个参数是文件名称，第二个参数是文件流
            mimeHelper.addAttachment(filename, FileUtils.urlNetToMultipartFile(filename, fileMap.get(filename)));
        }
        if (Cc != null) {
            // 抄送人邮箱地址
            mimeHelper.setCc(Cc);
        }
        }catch (Exception e){
            System.out.println("1111111111111111");
        }
        javaMailSender.send(mimeMessage);
    }

    /**
     * 模板解析方法，解析出一个String的html返回
     * @param templateName 模板文件名称(带后缀)
     * @param model 使用Map作为数据模型，定义属性和值
     * @return
     */
    @SneakyThrows({IOException.class, TemplateException.class})
    public String templateHtml(String templateName, Map<String, Object> model)throws  Exception {
        // 获得模板
        Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
        // 传入数据模型到模板，替代模板中的占位符，并将模板转化为html字符串
        String templateHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
        // 该方法本质上还是发送html邮件，调用之前发送html邮件的方法
        return templateHtml;
    }
}
